package com.example.newbook.task;
import com.example.newbook.HttpClientDownloader1;
import com.example.newbook.config.FixedNameJsonFilePipeline;
import com.example.newbook.controller.SendWeixinController;
import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.Spider;
import us.codecraft.webmagic.processor.PageProcessor;
import us.codecraft.webmagic.selector.Html;

import java.io.File;
import java.io.IOException;
import java.util.Date;
import java.util.List;

/**
 * @program: littleRedBook240509
 * @author: tenghw
 * @create: 2024-05-10 13:39
 * @Version 1.0
 * @description:
 **/
@Slf4j
@Component
public class Task1 {
    public String urlPattern = "https://www.xiaohongshu.com/user/profile/\\d"; // 示例URL模式

    //public static String targetUrl = "https://www.xiaohongshu.com/user/profile/62ea803f000000001f0078f4"; // 应子冬的小红书
    public static String targetUrl = "https://www.xiaohongshu.com/user/profile/6027e18d000000000101ed3e"; // 我的小红书

    // 创建Caffeine的缓存构建器
    public static Cache<String, String> cache = Caffeine.newBuilder()
            .maximumSize(100)
            .build();

    // 获取桌面路径
    final static String desktopPath = System.getProperty("user.home") + File.separator +"Desktop";

    final static SendWeixinController sendWeixinController = new SendWeixinController();

    class GithubRepoPageProcessor implements PageProcessor {
        // 创建一个爬虫站点的配置信息
        // private Site site = Site.me().setRetryTimes(3).setSleepTime(100);
        // private Site site = Site.me().setRetryTimes(3).setSleepTime(1000).setUserAgent("Mozilla");
        public Site site = Site
                .me() // 创建一个默认的site方法
                .setRetryTimes(3)
                .setSleepTime(3000) // 请求的间隔时间
                .setUserAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36");


        @Override
        public void process(Page page) {
            Html html = page.getHtml();

            //System.out.println("--------------------------------------------------------------------------------");
            ////System.out.println(html);
            //System.out.println("--------------------------------------------------------------------------------");
            ////List<Selectable> nodes = html.xpath("//div[@class='ui two cards']//p[@class='description mt-1 mb-1']//text()").nodes();
            //List<Selectable> titles = html.xpath("//div[@class='feeds-tab-container']//a[@class='title']/span/text()").nodes();
            //System.out.println("--------------------------------------------------------------------------------");
            ////titles.forEach(System.out::println);
            //titles.forEach(title -> {
            //            System.out.println(titles);
            //});
            //            page.putField("title", titles);
            //System.out.println("--------------------------------------------------------------------------------");

            /**
             * “/” 代表从当前节点开始，沿着XML/HTML结构向下一层级地选择直接子节点。例如，/html/body/div 会选取文档中所有直接位于<html>标签下的<body>标签，再从<body>下选择所有的<div>。
             *
             * “//” 是一个通配符，表示从当前节点开始，在整个文档中搜索，不限定层级，只要是在当前节点的子孙节点中即可。例如，//div 会选取文档中所有的<div>元素，无论它们处于多深的层级。
             * //a[@class='title'] 会查找文档中任何层级下class属性为"title"的<a>元素
             */
            List<String> titles = page.getHtml().xpath("//a[@class='title']//span//text()").all();
            if(CollectionUtils.isNotEmpty(titles)){
                titles.forEach(title -> {
                    //System.out.println("文章标题：" + title);
                    log.warn("文章标题：{}"+ title);
                });
                //page.putField("title", titles.get(0));

                if(cache.getIfPresent("title")==null){
                    cache.put("title", titles.get(0));
                    // 将提取的数据保存到Page对象中，供其他管道处理
                    page.putField("title", titles.get(0));
                    sendWeixinController.sendTemplateMessage(titles.get(0));
                }else if (cache.getIfPresent("title").equals(titles.get(0))){
                    log.warn("{}不需要放入page：{}"+ titles.get(0));
                }else{
                    cache.put("title", titles.get(0));
                    page.putField("title", titles.get(0));
                    sendWeixinController.sendTemplateMessage(titles.get(0));
                    }


            // 页面解析逻辑，例如提取帖子链接、用户信息等
            //if (page.getUrl().regex("https://www.xiaohongshu.com/user/profile/62ea803f000000001f0078f4").match()) {
            //    // 根据实际页面结构调整XPath或CSS选择器
            //    String title = html.xpath("//div[@class='feeds-tab-container']//a[@class='title']/span/text()").toString();
            //    System.out.println("发布的文章标题:" + title);
            //    // 如果需要，可以将这些文本存储到字段中或通过Pipeline进行后续处理。当页面处理完毕，WebMagic会收集所有putField存放的数据，这些数据会被传递到管道(Pipeline)中进行进一步处理，比如存储到数据库或文件中。
            //    //page.putField("title", title);
            }

            // 如果发现新的链接，就加入到待抓取队列（即提取下一页URL）
            //page.addTargetRequests(page.getHtml().links().regex("https://www.xiaohongshu.com/user/profile/62ea803f000000001f0078f4").all());
        }
        @Override
        public Site getSite() {
            return site;
        }
    }

    @Scheduled(fixedRate = 1000) // 每1秒执行一次
    public void executeTaskEveryFiveSeconds() {
        System.out.println("当前时间为：" + new Date() + "，任务正在执行...");
        // 在这里编写你希望周期性执行的代码

        //String targetUrl1 ="https://gitee.com/tenghuawei";
        //Spider.create(new NewbookApplication().new GithubRepoPageProcessor()).addUrl(targetUrl1).thread(5).run();



        Spider.create(new Task1().new GithubRepoPageProcessor())
                .addUrl(targetUrl)//从targetUrl上抓取数据
                //.addPipeline(new JsonFilePipeline("C:\\Users\\Administrator\\Desktop\\webmagic\\"))// 生成随机名称的.json文件
                .addPipeline(new FixedNameJsonFilePipeline(desktopPath, "redbok")) // 生成固定名称的.json文件
                .setDownloader(new HttpClientDownloader1())
                .thread(5)//开启5个线程抓取
                .run();//启动爬虫
    }
}